{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Syft Keras सह खाजगी भविष्यवाण्या"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "## चरण 3: Syft Keras वापरुन खाजगी भविष्यवाणी - सर्व्हिंग (क्लायंट)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "अनुवादक/संपादक:\n",
    "- Krunal Kshirsagar - Twitter: [@krunal_wrote](https://twitter.com/krunal_wrote) - Github: [@Noob-can-Compile](https://github.com/Noob-can-Compile)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "अभिनंदन! आपल्या मॉडेलला सामान्य Keras प्रशिक्षण दिल्यानंतर आणि त्यास Syft Keras सह सुरक्षित केल्यानंतर आपण काही खाजगी भविष्यवाण्यांसाठी विनंती करण्यास तयार आहात."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.datasets import mnist\n",
    "\n",
    "import syft as sy"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "## डेटा"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "येथे, आपण आपला MNIST डेटा तयार करतो. हे प्रशिक्षणादरम्यान आपण कसे पूर्वप्रक्रिया केले ते सारखेच आहे."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# input image dimensions\n",
    "img_rows, img_cols = 28, 28\n",
    "\n",
    "# the data, split between train and test sets\n",
    "(x_train, y_train), (x_test, y_test) = mnist.load_data()\n",
    "\n",
    "x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)\n",
    "x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)\n",
    "input_shape = (img_rows, img_cols, 1)\n",
    "\n",
    "x_train = x_train.astype('float32')\n",
    "x_test = x_test.astype('float32')\n",
    "x_train /= 255\n",
    "x_test /= 255"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "## मॉडेलला कनेक्ट करा"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "मॉडेलची चौकशी करण्यापूर्वी, आपल्याला त्यास फक्त कनेक्ट करावे लागेल. असे करण्यासाठी, आपण एक क्लायंट तयार करू शकता. मग तंतोतंत समान तीन TFEWorkers (`alice` , `bob` , और `carol`) आणि क्लस्टर परिभाषित करा. शेवटी `connect_to_model` कॉल करा. हे क्लायंट बाजूस एक TFE क्यूइंग सर्व्हर तयार करते जो **भाग 13b** मध्ये `model.serve ()` द्वारे सेट अप केलेल्या रांगेत असलेल्या सर्व्हरशी जोडला जातो. पूर्वानुमान विनंतीमध्ये शेअर्स सबमिट करण्यापूर्वी प्लेन टेक्स्ट डेटा गुप्तपणे सामायिक करण्यासाठी रांग जबाबदार असेल."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_classes = 10\n",
    "input_shape = (1, 28, 28, 1)\n",
    "output_shape = (1, num_classes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "INFO:tf_encrypted:Starting session on target 'grpc://localhost:4000' using config graph_options {\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "client = sy.TFEWorker()\n",
    "\n",
    "alice = sy.TFEWorker(host='localhost:4000')\n",
    "bob = sy.TFEWorker(host='localhost:4001')\n",
    "carol = sy.TFEWorker(host='localhost:4002')\n",
    "cluster = sy.TFECluster(alice, bob, carol)\n",
    "\n",
    "client.connect_to_model(input_shape, output_shape, cluster)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "## क्वेरी मॉडल"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "आपण काही खाजगी अंदाज घेण्यासाठी तयार आहात! `query_model` ला कॉल करणे ही `image` वर तयार केलेल्या रांगेत समाविष्ट केली जाईल, स्थानिक पातळीवर डेटा सामायिक करेल आणि **भाग 13 बी** मधील मॉडेल सर्व्हरवर शेअर्स सबमिट करेल."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "# User inputs\n",
    "num_tests = 3\n",
    "images, expected_labels = x_test[:num_tests], y_test[:num_tests]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The image had label 7 and was correctly classified as 7\n",
      "The image had label 2 and was correctly classified as 2\n",
      "The image had label 1 and was correctly classified as 1\n"
     ]
    }
   ],
   "source": [
    "for image, expected_label in zip(images, expected_labels):\n",
    "\n",
    "    res = client.query_model(image.reshape(1, 28, 28, 1))\n",
    "    predicted_label = np.argmax(res)\n",
    "\n",
    "    print(\"The image had label {} and was {} classified as {}\".format(\n",
    "        expected_label,\n",
    "        \"correctly\" if expected_label == predicted_label else \"wrongly\",\n",
    "        predicted_label))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "lang": "hi"
   },
   "source": [
    "हे उत्तम झाले. आपण या तीन प्रतिमांचे योग्य प्रकारे वर्गीकरण करण्यास सक्षम आहात! परंतु या भविष्यवाणींमध्ये विशेष म्हणजे आपण ही सेवा मिळविण्यासाठी कोणतीही खाजगी माहिती उघड केली नाही. मॉडेल होस्टने आपला इनपुट डेटा किंवा आपल्या अंदाज कधीही पाहिले नाहीत आणि आपण मॉडेल कधीही डाउनलोड केले नाही. आपण कूटबद्ध केलेल्या मॉडेलसह कूटबद्ध केलेल्या डेटावर खाजगी अंदाज प्राप्त करण्यास सक्षम होता!\n",
    "\n",
    "आमच्या स्वतःच्या अ‍ॅप्समध्ये हे लागू करण्यासाठी आपण गर्दी करण्यापूर्वी, आपल्या सर्व्ह केलेले मॉडेल साफ करण्यासाठी त्वरीत **भाग 13 बी** वर परत जाऊया!"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "nbTranslate": {
   "displayLangs": [
    "hi"
   ],
   "hotkey": "alt-t",
   "langInMainMenu": true,
   "sourceLang": "en",
   "targetLang": "hi",
   "useGoogleTranslate": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}